<?php

class CashMovement extends AppModel {

    var $name = 'CashMovement';
    //The Associations below have been created with all possible keys, those that are not needed can be removed

    var $belongsTo = array(
        'Cash' => array(
            'className' => 'Cash',
            'foreignKey' => 'cash_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Job' => array(
            'className' => 'Job',
            'foreignKey' => 'job_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Employee' => array(
            'className' => 'Employee',
            'foreignKey' => 'employee_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Provider' => array(
            'className' => 'Provider',
            'foreignKey' => 'provider_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Expense' => array(
            'className' => 'Expense',
            'foreignKey' => 'expense_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

    /**
     * Función en la cual le vamos a asignar la caja a la que pertenece un movimiento
     * el id de la caja actual. En caso de no existir una caja para el día de hoy, le vamos
     * a crear una nueva.
     * Solo vamos a pisar el cash_id en un create y no en un update
     * @param type $options
     * @return boolean
     */
    function beforeSave($options = array()) {

        $data = & $this->data;

        //si es una creación de un movimiento, entonces vamos a tomar la caja actual
        //si es una edición no lo vamos a tomar, porque podríamos estar cambiando
        //los movimientos de una caja a otra y sería cualquiera
        if (!isset($data[$this->alias]['id'])) {
            //es una creación
            //tomamos la caja actual
            $cash = $this->Cash->getActual();
            $data[$this->alias]['cash_id'] = $cash['Cash']['id'];
            $data[$this->alias]['user_id'] = $_SESSION['Auth']['User']['id'];
        }

        return true;
    }

    /**
     * Función para que despues de que se creo un nuevo movimiento, se actualice
     * el monto actual de su caja, haciendo la sumatoria de todos los montos
     * @param type $options
     * @return boolean
     */
    function afterSave($options = array()) {
        $data = & $this->data;

        if (!isset($data[$this->alias]['cash_id'])) {
            //si no viene seteada la caja, la vamos a tener que buscar trayendo 
            //el movimiento entero porque es una edición
            //en el caso de una creación no vamos a tener problema porque ya se le
            //esta asignando el cash_id en el metodo beforeSave
            $mov = $this->find('first', array(
                'recursive' => -1,
                'conditions' => array(
                    'CashMovement.id' => $data[$this->alias]['id']
                )
                    ));

            $cash_id = $mov['CashMovement']['cash_id'];
        } else {
            $cash_id = $data[$this->alias]['cash_id'];
        }

        //busco la caja ahora para saber cual fue el monto con el que se abrió
        $cash = $this->Cash->find('first', array(
            'recursive' => -1,
            'conditions' => array(
                'Cash.id' => $cash_id
            )
                ));

        $res = $this->find('first', array(
            'recursive' => -1,
            'fields' => array('SUM(CASE WHEN TYPE = "in" THEN amount ELSE (amount * -1)END) total'),
            'conditions' => array(
                'CashMovement.cash_id' => $cash_id
            ),
            'group' => array('CashMovement.cash_id')
                ));

        //ahora actulizamos la caja
        $array_guardar = array();
        $array_guardar['id'] = $cash_id;
        $array_guardar['actual_amount'] = $res[0]['total'] + $cash['Cash']['open_amount'];
        $this->Cash->save($array_guardar);

        return true;
    }

}
